function validate(frmId) {
	var result = true;
	var allInput = $('#' + frmId + ' input,#' + frmId + ' select');
	var len = allInput.length;
	var j = 0;
	for ( var i = 0; i < len; i++) {
		var inpx = $(allInput.get(i));
		var validateFlag = validateInput(inpx);
		if (validateFlag == false && j == 0) {
			result = validateFlag;
			j++;
		}
	}
	return result;
}

function validateInput(inpx) {
	var inpClass = inpx.attr('class');
	if (inpClass != null && inpClass.indexOf('validate[') > -1) {
		var indexBegin = inpClass.indexOf('validate[') + 9;
		var indexEnd = 10;
		var endFlag = 1;
		while (true) {
			var oneChar = inpClass.substring(indexEnd, indexEnd + 1);
			if ('[' == oneChar) {
				endFlag++;
			} else if (']' == oneChar) {
				endFlag--;
			}
			if (endFlag == 0) {
				break;
			}
			indexEnd++;
			if (indexEnd > 500) {
				alert('验证语法错误。');
				return false;
			}
		}
		var validateStr = inpClass.substring(indexBegin, indexEnd);
		var validateGroup = validateStr.split(',');
		var groupLen = validateGroup.length;
		var type = inpx.attr('type');
		if ('text' == type) {
			for ( var j = 0; j < groupLen; j++) {
				var validateType = validateGroup[j].Trim();
				if ('require' == validateType) {
					if ('' == inpx.val() || inpx.val() == null) {
						addValidateClass(inpx, '该值不能为空。');
						return false;
					}
				} else if ('integer' == validateType) {
					var ptn = /^(\+|-)?\d+$/;
					if ('' != inpx.val() && !ptn.exec(inpx.val())) {
						addValidateClass(inpx, '该值必须为整数。');
						return false;
					}
				} else if ('number' == validateType) {
					var ptn = /^(\+|-)?\d+($|\.\d+$)/;
					if ('' != inpx.val() && !ptn.exec(inpx.val())) {
						addValidateClass(inpx, '该值必须为数字。');
						return false;
					}
				} else if ('plus' == validateType) {
					var ptn = /^(\+)?\d+($|\.\d+$)/;
					if ('' != inpx.val() && (!ptn.exec(inpx.val()) || parseFloat(inpx.val()) == 0.00)) {
						addValidateClass(inpx, '该值必须为正数。');
						return false;
					}
				} else if ('plus&0' == validateType) {
					var ptn = /^(\+)?\d+($|\.\d+$)/;
					if ('' != inpx.val() && !ptn.exec(inpx.val())) {
						addValidateClass(inpx, '该值必须为非负数。');
						return false;
					}
				} else if ('negative' == validateType) {
					var ptn = /^\-\d+($|\.\d+$)/;
					if ('' != inpx.val() && (!ptn.exec(inpx.val()) || parseFloat(inpx.val()) == 0.00)) {
						addValidateClass(inpx, '该值必须为负数。');
						return false;
					}
				} else if ('negative&0' == validateType) {
					var ptn = /^\-\d+($|\.\d+$)/;
					if ('' != inpx.val() && !ptn.exec(inpx.val()) && parseFloat(inpx.val()) != 0.00) {
						addValidateClass(inpx, '该值必须为非正数。');
						return false;
					}
				} else if (validateType.indexOf('expression=') > -1) {
					if ('' != inpx.val()) {
						var expression = validateType.substring(validateType
								.indexOf('=') + 1, validateType.length);
						if (!eval(expression).exec(inpx.val())) {
							addValidateClass(inpx, '该值格式不正确。');
							return false;
						}
					}
				} else if (validateType.indexOf('maxlength=') > -1) {
					var maxlength = parseInt(validateType.split('=')[1]);
					var inpLen = inpx.val().length;
					if (inpLen > maxlength) {
						addValidateClass(inpx, '该值长度不能超过' + maxlength + '个字符。');
						return false;
					}
				} else if (validateType.indexOf('minlength=') > -1) {
					var minlength = parseInt(validateType.split('=')[1]);
					var inpLen = inpx.val().length;
					if (inpLen < minlength) {
						addValidateClass(inpx, '该值长度不能小于' + minlength + '个字符。');
						return false;
					}
				} else if (validateType.indexOf('equals=') > -1) {
					var compareId = validateType.split('=')[1];
					var compareObj = $('#' + compareId);
					if (inpx.val() != compareObj.val()) {
						addValidateClass(inpx, '该值不等于' + compareObj
								.attr('label') + '。');
						return false;
					}
				} else if (validateType.indexOf('ajax=') > -1) {
					var ajaxParam = validateType.split('=')[1];
					var func = '';
					if (ajaxParam.indexOf('(') == -1)
						func = '()';
					var paramObj = eval(ajaxParam + func);
					var url = paramObj.url;
					var params = paramObj.params;
					var returnResult = '';
					ajaxAsync(url, 'post', params, true, function(data){
						returnResult = data;
					});
					if(returnResult != null && '' != returnResult)
					{
						addValidateClass(inpx, returnResult);
						return false;
					}
				}
			}
		} else if ('select-one' == type || 'select' == type) {
			for ( var j = 0; j < groupLen; j++) {
				var validateType = validateGroup[j].Trim();
				if ('require' == validateType) {
					if ('' == inpx.val() || inpx.val() == null) {
						addValidateClass(inpx, '该值不能为空。');
						return false;
					}
				}
			}
		} else if ('radio' == type) {
			for ( var j = 0; j < groupLen; j++) {
				var validateType = validateGroup[j].Trim();
				if ('require' == validateType) {
					var inpName = inpx.attr('name');
					var radios = $('input:radio[name="' + inpName + '"][checked]');
					if (radios.length == 0) {
						addValidateClass(inpx, '该值不能为空。');
						return false;
					}
				}
			}
		} else if ('checkbox' == type) {
			for ( var j = 0; j < groupLen; j++) {
				var validateType = validateGroup[j].Trim();
				if ('require' == validateType) {
					var inpName = inpx.attr('name');
					var checkboxs = $('input:checkbox[name="' + inpName + '"][checked]');
					if (checkboxs.length == 0) {
						addValidateClass(inpx, '该值不能为空。');
						return false;
					}
				}
			}
		} else if ('textarea' == type) {
			for ( var j = 0; j < groupLen; j++) {
				var validateType = validateGroup[j].Trim();
				if ('require' == validateType) {
					if ('' == inpx.val() || inpx.val() == null) {
						addValidateClass(inpx, '该值不能为空。');
						return false;
					}
				} else if (validateType.indexOf('maxlength=') > -1) {
					var maxlength = parseInt(validateType.split('=')[1]);
					var inpLen = inpx.val().length;
					if (inpLen > maxlength) {
						addValidateClass(inpx, '该值长度不能超过' + maxlength + '个字符。');
						return false;
					}
				} else if (validateType.indexOf('minlength=') > -1) {
					var minlength = parseInt(validateType.split('=')[1]);
					var inpLen = inpx.val().length;
					if (inpLen < minlength) {
						addValidateClass(inpx, '该值长度不能小于' + minlength + '个字符。');
						return false;
					}
				}
			}
		}
	}
	
	if (inpx.hasClass('inputError')) {
		removeValidateClass(inpx);
	}
	return true;
}

function addValidateClass(obj, msg) {
	var left = parseInt(obj.offset().left);
	var top = parseInt(obj.offset().top);
	var moveLeft = parseInt(obj.width()) / 2;
	var frameId = obj.attr('id') + 'Frame';
	var msgDivId = obj.attr('id') + 'Div';
	var msgTdId = obj.attr('id') + 'Td';
	var msgTdBefore = $('#' + msgTdId);
	if (msgTdBefore.length > 0) {
		msgTdBefore.text(msg);
		return;
	}
	var msgDiv = new Array();
	msgDiv.push('<div class="disp" id="' + msgDivId
			+ '" style="position:absolute;z-index:1001;left:'
			+ (left + moveLeft) + 'px;">');
	msgDiv.push('<div class="disp" style="width:5px;height:25px;background-image:url('+realPath+'/common/validate/images/msgLeft.png);background-repeat:no-repeat;"></div>');
	msgDiv.push('<div class="disp" id="'
					+ msgTdId
					+ '" style="padding:3px 0px 0px 0px;height:25px;background-image:url('+realPath+'/common/validate/images/msgMiddle.png);background-repeat:repeat-x;">'
					+ msg + '</div>');
	msgDiv.push('<div class="disp" style="width:5px;height:25px;background-image:url('+realPath+'/common/validate/images/msgRight.png);background-repeat:no-repeat;"></div>');
	msgDiv.push('</div>');
	$('#validateMsgDiv').append(msgDiv.join(''));
	var divObj = $('#' + msgDivId);
	var divWidth = parseInt(divObj.width());
	var divHeight = parseInt(divObj.height());
	var msgHeight = top - divHeight + 8;
	divObj.css('top', msgHeight);
	var frame = '<iframe width="'
			+ divWidth
			+ '" height="'
			+ 22
			+ 'px" id="'
			+ frameId
			+ '" style="left:'
			+ (left + moveLeft)
			+ 'px;top:'
			+ msgHeight
			+ 'px;position:absolute;z-index:1000;" frameborder="0" scrolling="no"></iframe>';
	$('#validateMsgDiv').append(frame);
	obj.addClass('inputError');
}

function removeValidateClass(obj) {
	var frameId = obj.attr('id') + 'Frame';
	var msgDivId = obj.attr('id') + 'Div';
	var frameObj = $('#' + frameId);
	var msgDivObj = $('#' + msgDivId);
	if (frameObj.length > 0) {
		frameObj.remove();
	}
	if (msgDivObj.length > 0) {
		msgDivObj.remove();
	}
	if(obj.hasClass('inputError'))
	{
		obj.removeClass('inputError');
	}
}

function initValidate(frmId) {
	var allInput = $('#' + frmId + ' input,#' + frmId + ' select');
	var len = allInput.length;
	for ( var i = 0; i < len; i++) {
		var inpx = $(allInput.get(i));
		bindInput(inpx);
	}
}

function bindInput(inpx) {
	var inpClass = inpx.attr('class');
	if (inpClass != null && inpClass.indexOf('validate[') > -1) {
		var type = inpx.attr('type');
		if ('text' == type) {
			inpx.bind('blur', function() {
				validateInput($(this));
			});
		} else if ('select-one' == type || 'select' == type) {
			inpx.bind('change', function() {
				validateInput($(this));
			});
		} else if ('radio' == type) {
			var name = inpx.attr('name');
			var radios = $('input:radio[name="' + name + '"]');
			var radioLen = radios.length;
			for ( var i = 0; i < radioLen; i++) {
				var rx = $(radios.get(i));
				rx.bind('click', function() {
					validateInput(inpx);
				});
			}
		} else if ('checkbox' == type) {
			var name = inpx.attr('name');
			var checkboxs = $('input:checkbox[name="' + name + '"]');
			var checkboxLen = checkboxs.length;
			for ( var i = 0; i < checkboxLen; i++) {
				var cbx = $(checkboxs.get(i));
				cbx.bind('click', function() {
					validateInput(inpx);
				});
			}
		} else if ('textarea' == type) {
			inpx.bind('blur', function() {
				validateInput($(this));
			});
		}
	}
}